#!/bin/sh
# parse interface configuration tuples:
#   iface:proto[:ipv4addr/netmask[:ipv4gw]]
# and write it down as intended

fatal() { echo "error: $*" >&2; exit 1; }

# simple etcnet configurations are also picked up by NM
if [ -n "$GLOBAL_NMCTL" ]; then
	NMCTL="$GLOBAL_NMCTL"
else
	if type -t NetworkManager >&/dev/null ||
	   type -t connmand >&/dev/null; then
		NMCTL=yes
	else
		NMCTL=no
	fi
fi

ETCNET_IFDIR="/etc/net/ifaces"
SYSTEMD_IFDIR="/etc/systemd/network"

write_iface() {
	case "$proto" in
	dhcp*)
		;;
	static)
		[ -n "$ipv4addr" ] || fatal "ipv4addr missing"
		;;
	*)
		fatal "unknown proto value: $proto"
		;;
	esac
	[ -d "$ETCNET_IFDIR" ] && write_etcnet_iface ||:
	[ -d "$SYSTEMD_IFDIR" ] && write_systemd_iface ||:
}

# these use global variables
write_etcnet_iface() {
	dir="$ETCNET_IFDIR/$iface"
	mkdir -p "$dir"
	append=
	case "$proto" in
	dhcp*)
		append="DHCP_TIMEOUT=$GLOBAL_NET_ETH_TIMEOUT"
		;;
	static)
		echo "$ipv4addr" > "$dir/ipv4address"
		[ -z "$ipv4gw" ] ||
			echo "default via $ipv4gw" > "$dir/ipv4route"
		;;
	esac
	{
		echo "TYPE=eth"
		echo "BOOTPROTO=$proto"
		echo "NM_CONTROLLED=$NMCTL"
		echo "DISABLED=$NMCTL"
		echo "#USE_IFPLUGD=yes"
		[ -z "$append" ] || echo "$append"
	} > "$dir/options"
}

write_systemd_iface() {
	case "$proto" in
	dhcp4)
		echo "[Match]"
		echo "Name=$iface"
		echo
		echo "[Network]"
		echo "DHCP=ipv4"
		echo "IPv6AcceptRA=no"
		echo "LinkLocalAddressing=ipv4"
		echo
		echo "[DHCP]"
		echo "UseMTU=yes"
		echo "UseDomains=yes"
		echo "UseNTP=yes"
		echo
		;;
	dhcp)
		echo "[Match]"
		echo "Name=$iface"
		echo
		echo "[Network]"
		echo "DHCP=yes"
		echo
		echo "[DHCP]"
		echo "UseMTU=yes"
		echo "UseDomains=yes"
		echo "UseNTP=yes"
		echo
		;;
	static)
		echo "[Match]"
		echo "Name=$iface"
		echo
		echo "[Network]"
		echo "Address=$ipv4addr"
		[ -z "$ipv4gw" ] ||
			echo "Gateway=$ipv4gw"
		echo "LinkLocalAddressing=no"
		;;
	esac > "$SYSTEMD_IFDIR/$iface.network"
}

[ -z "$GLOBAL_NET_ETH" ] ||
	echo "$GLOBAL_NET_ETH" \
	| tr ' ' '\n' \
	| while IFS=':' read iface proto ipv4addr ipv4gw; do
		[ -n "$iface" -a -n "$proto" ] || continue
		write_iface
	done
